package cn.tedu.suppermemory.service.impl;

import cn.tedu.suppermemory.ex.ServiceException;
import cn.tedu.suppermemory.mapper.ScoreMapper;
import cn.tedu.suppermemory.pojo.dto.ScoreAddNewDTO;
import cn.tedu.suppermemory.pojo.dto.ScoreUpdateDTO;
import cn.tedu.suppermemory.pojo.entity.Score;
import cn.tedu.suppermemory.pojo.vo.ScoreListItemVO;
import cn.tedu.suppermemory.pojo.vo.ScoreStandardVO;
import cn.tedu.suppermemory.service.IScoreService;
import cn.tedu.suppermemory.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import java.util.List;

@Slf4j
@Controller
public class ScoreServiceImpl implements IScoreService {

    @Autowired
    private ScoreMapper scoreMapper;

    public ScoreServiceImpl(){log.debug("创建业务类对象：ScoreServiceImpl");}

    @Override
    public void addNew(ScoreAddNewDTO scoreAddNewDTO) {

        log.debug("开始处理【添加学生成绩】的业务，参数：{}", scoreAddNewDTO);
        // 检查班级id是否已经被占用
        Long studentId = scoreAddNewDTO.getStudentId();
        int countByName = scoreMapper.countByName(studentId);
        if (countByName > 0) {
            // 如果已经被占用，抛出异常
            String message = "添加学生成绩失败，学生成绩数据已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建courses对象
        Score score = new Score();
        BeanUtils.copyProperties(scoreAddNewDTO,score);
        log.debug("即将插入数据，参数：{}",score);
        int rows = scoreMapper.insert(score);
        if (rows != 1) {
            String message = "添加学生成绩失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }

    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除学生成绩】的业务，参数：{}", id);
        Object queryResult = scoreMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除学生成绩失败，尝试删除的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        log.debug("即将执行删除数据，参数：{}", id);
        int rows = scoreMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除学生成绩失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }

    }

    @Override
    public void updateInfoById(Long id, ScoreUpdateDTO scoreUpdateDTO) {
        log.debug("开始处理【修改学生成绩详情】的业务，参数ID：{}，新数据：{}", id, scoreUpdateDTO);
        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            ScoreStandardVO teacher = scoreMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (teacher == null) {
                String message = "修改学生成绩详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        {
            // 调用Mapper的countByName()执行查询，检查新的班级是否已经被别的数据占用
            int count = scoreMapper.countByName(scoreUpdateDTO.getClassId());
            // 是：名称被别的数据占用，抛出异常（NOT_CONFLICT）
            if (count > 0) {
                String message = "修改学生成绩详情失败，新的学生成绩名称已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }
        // 创建courses对象
        Score score = new Score();
        // 将参数对象的属性值复制到以上新创建的courses对象中
        BeanUtils.copyProperties(scoreUpdateDTO, score);
        score.setId(id);
        // 调用Mapper的update(Courses courses)方法执行修改
        log.debug("即将执行修改数据，参数：{}", score);
        int rows = scoreMapper.update(score);
        if (rows != 1) {
            String message = "修改学生成绩详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }

    }

    @Override
    public ScoreStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询学生成绩详情】的业务，参数：{}", id);
        ScoreStandardVO teacher = scoreMapper.getStandardById(id);
        if (teacher == null) {
            String message = "查询学生成绩详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        log.debug("即将返回查询结果：{}", teacher);
        return teacher;

    }

    @Override
    public List<ScoreListItemVO> list() {
        log.debug("开始处理【查询学生成绩列表】的业务，无参数");
        List<ScoreListItemVO> list = scoreMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;

    }


}
